package solutions.ferpa.ztest.ent;

import java.sql.*;
import java.util.ArrayList;
import br.com.telescope.adsrt.dom.*;
import br.com.telescope.adsrt.lib.*;
import br.com.telescope.t2.exception.Severity;

/**
 * API de persistência de dados da entidade ITEM_INSTRUCAO
 * @author Gerado pelo Telescope
 */
public class EntItemInstrucao extends Entity {
    
    public final static String ENTITY_NAME = "ZTEST.ITEM_INSTRUCAO";
    public final static String TABLE_NAME = "ITEM_INSTRUCAO";
    
    // <editor-fold defaultstate="collapsed" desc="Contrutores e inicializacao">
    /**
     * Construtores
     */
    public EntItemInstrucao() {
        super();
        initialize();
    }
    
    public EntItemInstrucao(BaseRuntime ctx) {
        super();
        initialize(ctx);
    }
    
    @Override
    public String getPrimaryKeyColumn() {
        return "ID";
    }
    
    @Override
    public void initialize(BaseRuntime ctx) {
        super.initialize(ctx);
        initialize();
    }
    
    public void initialize() {
        aId = new DomId(this,"ID", "Id"); 
        aId.setRequired(true);
        oId = new DomId();
        aSigla = new DomUpper(this,"SIGLA", "Sigla de identificação do item"); 
        aSigla.setRequired(true);
        aSigla.setSize(64);
        oSigla = new DomUpper();
        aItemInstrucaoPaiId = new DomId(this,"ITEM_INSTRUCAO_PAI_ID", "Item da instrução (pai)"); 
        oItemInstrucaoPaiId = new DomId();
        aItemInstrucaoReferenciaId = new DomId(this,"ITEM_INSTRUCAO_REFERENCIA_ID", "Item da instrução (referência)"); 
        oItemInstrucaoReferenciaId = new DomId();
        aDescricao = new DomWiki(this,"DESCRICAO", "Descrição do item da instrução"); 
        aDescricao.setRequired(true);
        aDescricao.setSize(512);
        oDescricao = new DomWiki();
        aSequencia = new DomInteger(this,"SEQUENCIA", "Sequência do item da instrução"); 
        aSequencia.setRequired(true);
        oSequencia = new DomInteger();
        aInstrucaoTrabalhoId = new DomId(this,"INSTRUCAO_TRABALHO_ID", "Instrução de trabalho"); 
        aInstrucaoTrabalhoId.setRequired(true);
        oInstrucaoTrabalhoId = new DomId();
        aTipoItemInstrucaoId = new DomId(this,"TIPO_ITEM_INSTRUCAO_ID", "Tipo do item da instrução"); 
        aTipoItemInstrucaoId.setRequired(true);
        oTipoItemInstrucaoId = new DomId();
        aExigeConfirmacaoExecucao = new DomFlag(this,"EXIGE_CONFIRMACAO_EXECUCAO", "Exige confirmação de execução"); 
        aExigeConfirmacaoExecucao.setRequired(true);
        aExigeConfirmacaoExecucao.setDefaultValue("N");
        oExigeConfirmacaoExecucao = new DomFlag();
        aAcaoAposResposta = new DomOption(this,"ACAO_APOS_RESPOSTA", "Ação após resposta do operador"); 
        aAcaoAposResposta.setRequired(true);
        aAcaoAposResposta.setSize(1);
        aAcaoAposResposta.clearOptions();
        aAcaoAposResposta.addOption("A", "Avançar 1 item");
        aAcaoAposResposta.addOption("T", "Cronometrar");
        aAcaoAposResposta.addOption("I", "Interromper");
        aAcaoAposResposta.addOption("P", "Pular para um item");
        aAcaoAposResposta.addOption("V", "Reiniciar (executar novamente)");
        aAcaoAposResposta.addOption("R", "Retornar 1 item");
        aAcaoAposResposta.setDefaultValue("A");
        oAcaoAposResposta = new DomOption();
        ressetModified();
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Atributos da entidade">
    
    // Id
    private DomId aId;
    private DomId oId;
    
    // Sigla de identificação do item
    private DomUpper aSigla;
    private DomUpper oSigla;
    
    // Item da instrução (pai)
    private DomId aItemInstrucaoPaiId;
    private DomId oItemInstrucaoPaiId;
    
    // Item da instrução (referência)
    private DomId aItemInstrucaoReferenciaId;
    private DomId oItemInstrucaoReferenciaId;
    
    // Descrição do item da instrução
    private DomWiki aDescricao;
    private DomWiki oDescricao;
    
    // Sequência do item da instrução
    private DomInteger aSequencia;
    private DomInteger oSequencia;
    
    // Instrução de trabalho
    private DomId aInstrucaoTrabalhoId;
    private DomId oInstrucaoTrabalhoId;
    
    // Tipo do item da instrução
    private DomId aTipoItemInstrucaoId;
    private DomId oTipoItemInstrucaoId;
    
    // Exige confirmação de execução
    private DomFlag aExigeConfirmacaoExecucao;
    private DomFlag oExigeConfirmacaoExecucao;
    
    // Ação após resposta do operador
    private DomOption aAcaoAposResposta;
    private DomOption oAcaoAposResposta;
    
    // <editor-fold defaultstate="collapsed" desc="Atributo ID">
    
    public EntItemInstrucao id(Long value) {
        setId(value);
        return this;
    }
    
    public void setId(DomId value) {
        if (value == null || value.isNull()) {
            nullifyId();
        } else {
            aId.setValue(value.getValue());
            if (aId.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setId(String value) {
        if (value == null) {
            nullifyId();
        } else {
            aId.setValue(value);
            if (aId.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setId(Long value) {
        aId.setValue(value);
        if (aId.isModified()) {
            setModified(true);
        }
    }
    
    public void setId(Object value) {
        aId.setValue(value);
        if (aId.isModified()) {
            setModified(true);
        }
    }
    
    public void nullifyId() {
        if (!aId.isNull()) {
            aId.setNull(true);
            setModified(true);
        }
    }
    
    public DomId getId() {
        return aId;
    }
    
    public DomId oldId() {
        return oId;
    }
    
    public Long valueOfId() {
        return aId.getValue();
    }
    
    public boolean isIdModified() {
        return aId.isModified();
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Atributo SIGLA">
    
    public EntItemInstrucao sigla(String value) {
        setSigla(value);
        return this;
    }
    
    public void setSigla(DomUpper value) {
        if (value == null || value.isNull()) {
            nullifySigla();
        } else {
            aSigla.setValue(value.getValue());
            if (aSigla.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setSigla(String value) {
        if (value == null) {
            nullifySigla();
        } else {
            aSigla.setValue(value);
            if (aSigla.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setSigla(Object value) {
        aSigla.setValue(value);
        if (aSigla.isModified()) {
            setModified(true);
        }
    }
    
    public void nullifySigla() {
        if (!aSigla.isNull()) {
            aSigla.setNull(true);
            setModified(true);
        }
    }
    
    public DomUpper getSigla() {
        return aSigla;
    }
    
    public DomUpper oldSigla() {
        return oSigla;
    }
    
    public String valueOfSigla() {
        return aSigla.getValue();
    }
    
    public boolean isSiglaModified() {
        return aSigla.isModified();
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Atributo ITEM_INSTRUCAO_PAI_ID">
    
    public EntItemInstrucao itemInstrucaoPaiId(Long value) {
        setItemInstrucaoPaiId(value);
        return this;
    }
    
    public void setItemInstrucaoPaiId(DomId value) {
        if (value == null || value.isNull()) {
            nullifyItemInstrucaoPaiId();
        } else {
            aItemInstrucaoPaiId.setValue(value.getValue());
            if (aItemInstrucaoPaiId.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setItemInstrucaoPaiId(String value) {
        if (value == null) {
            nullifyItemInstrucaoPaiId();
        } else {
            aItemInstrucaoPaiId.setValue(value);
            if (aItemInstrucaoPaiId.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setItemInstrucaoPaiId(Long value) {
        aItemInstrucaoPaiId.setValue(value);
        if (aItemInstrucaoPaiId.isModified()) {
            setModified(true);
        }
    }
    
    public void setItemInstrucaoPaiId(Object value) {
        aItemInstrucaoPaiId.setValue(value);
        if (aItemInstrucaoPaiId.isModified()) {
            setModified(true);
        }
    }
    
    public void nullifyItemInstrucaoPaiId() {
        if (!aItemInstrucaoPaiId.isNull()) {
            aItemInstrucaoPaiId.setNull(true);
            setModified(true);
        }
    }
    
    public DomId getItemInstrucaoPaiId() {
        return aItemInstrucaoPaiId;
    }
    
    public DomId oldItemInstrucaoPaiId() {
        return oItemInstrucaoPaiId;
    }
    
    public Long valueOfItemInstrucaoPaiId() {
        return aItemInstrucaoPaiId.getValue();
    }
    
    public boolean isItemInstrucaoPaiIdModified() {
        return aItemInstrucaoPaiId.isModified();
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Atributo ITEM_INSTRUCAO_REFERENCIA_ID">
    
    public EntItemInstrucao itemInstrucaoReferenciaId(Long value) {
        setItemInstrucaoReferenciaId(value);
        return this;
    }
    
    public void setItemInstrucaoReferenciaId(DomId value) {
        if (value == null || value.isNull()) {
            nullifyItemInstrucaoReferenciaId();
        } else {
            aItemInstrucaoReferenciaId.setValue(value.getValue());
            if (aItemInstrucaoReferenciaId.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setItemInstrucaoReferenciaId(String value) {
        if (value == null) {
            nullifyItemInstrucaoReferenciaId();
        } else {
            aItemInstrucaoReferenciaId.setValue(value);
            if (aItemInstrucaoReferenciaId.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setItemInstrucaoReferenciaId(Long value) {
        aItemInstrucaoReferenciaId.setValue(value);
        if (aItemInstrucaoReferenciaId.isModified()) {
            setModified(true);
        }
    }
    
    public void setItemInstrucaoReferenciaId(Object value) {
        aItemInstrucaoReferenciaId.setValue(value);
        if (aItemInstrucaoReferenciaId.isModified()) {
            setModified(true);
        }
    }
    
    public void nullifyItemInstrucaoReferenciaId() {
        if (!aItemInstrucaoReferenciaId.isNull()) {
            aItemInstrucaoReferenciaId.setNull(true);
            setModified(true);
        }
    }
    
    public DomId getItemInstrucaoReferenciaId() {
        return aItemInstrucaoReferenciaId;
    }
    
    public DomId oldItemInstrucaoReferenciaId() {
        return oItemInstrucaoReferenciaId;
    }
    
    public Long valueOfItemInstrucaoReferenciaId() {
        return aItemInstrucaoReferenciaId.getValue();
    }
    
    public boolean isItemInstrucaoReferenciaIdModified() {
        return aItemInstrucaoReferenciaId.isModified();
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Atributo DESCRICAO">
    
    public EntItemInstrucao descricao(String value) {
        setDescricao(value);
        return this;
    }
    
    public void setDescricao(DomWiki value) {
        if (value == null || value.isNull()) {
            nullifyDescricao();
        } else {
            aDescricao.setValue(value.getValue());
            if (aDescricao.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setDescricao(String value) {
        if (value == null) {
            nullifyDescricao();
        } else {
            aDescricao.setValue(value);
            if (aDescricao.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setDescricao(Object value) {
        aDescricao.setValue(value);
        if (aDescricao.isModified()) {
            setModified(true);
        }
    }
    
    public void nullifyDescricao() {
        if (!aDescricao.isNull()) {
            aDescricao.setNull(true);
            setModified(true);
        }
    }
    
    public DomWiki getDescricao() {
        return aDescricao;
    }
    
    public DomWiki oldDescricao() {
        return oDescricao;
    }
    
    public String valueOfDescricao() {
        return aDescricao.getValue();
    }
    
    public boolean isDescricaoModified() {
        return aDescricao.isModified();
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Atributo SEQUENCIA">
    
    public EntItemInstrucao sequencia(Integer value) {
        setSequencia(value);
        return this;
    }
    
    public void setSequencia(DomInteger value) {
        if (value == null || value.isNull()) {
            nullifySequencia();
        } else {
            aSequencia.setValue(value.getValue());
            if (aSequencia.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setSequencia(String value) {
        if (value == null) {
            nullifySequencia();
        } else {
            aSequencia.setValue(value);
            if (aSequencia.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setSequencia(Integer value) {
        aSequencia.setValue(value);
        if (aSequencia.isModified()) {
            setModified(true);
        }
    }
    
    public void setSequencia(Object value) {
        aSequencia.setValue(value);
        if (aSequencia.isModified()) {
            setModified(true);
        }
    }
    
    public void nullifySequencia() {
        if (!aSequencia.isNull()) {
            aSequencia.setNull(true);
            setModified(true);
        }
    }
    
    public DomInteger getSequencia() {
        return aSequencia;
    }
    
    public DomInteger oldSequencia() {
        return oSequencia;
    }
    
    public Integer valueOfSequencia() {
        return aSequencia.getValue();
    }
    
    public boolean isSequenciaModified() {
        return aSequencia.isModified();
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Atributo INSTRUCAO_TRABALHO_ID">
    
    public EntItemInstrucao instrucaoTrabalhoId(Long value) {
        setInstrucaoTrabalhoId(value);
        return this;
    }
    
    public void setInstrucaoTrabalhoId(DomId value) {
        if (value == null || value.isNull()) {
            nullifyInstrucaoTrabalhoId();
        } else {
            aInstrucaoTrabalhoId.setValue(value.getValue());
            if (aInstrucaoTrabalhoId.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setInstrucaoTrabalhoId(String value) {
        if (value == null) {
            nullifyInstrucaoTrabalhoId();
        } else {
            aInstrucaoTrabalhoId.setValue(value);
            if (aInstrucaoTrabalhoId.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setInstrucaoTrabalhoId(Long value) {
        aInstrucaoTrabalhoId.setValue(value);
        if (aInstrucaoTrabalhoId.isModified()) {
            setModified(true);
        }
    }
    
    public void setInstrucaoTrabalhoId(Object value) {
        aInstrucaoTrabalhoId.setValue(value);
        if (aInstrucaoTrabalhoId.isModified()) {
            setModified(true);
        }
    }
    
    public void nullifyInstrucaoTrabalhoId() {
        if (!aInstrucaoTrabalhoId.isNull()) {
            aInstrucaoTrabalhoId.setNull(true);
            setModified(true);
        }
    }
    
    public DomId getInstrucaoTrabalhoId() {
        return aInstrucaoTrabalhoId;
    }
    
    public DomId oldInstrucaoTrabalhoId() {
        return oInstrucaoTrabalhoId;
    }
    
    public Long valueOfInstrucaoTrabalhoId() {
        return aInstrucaoTrabalhoId.getValue();
    }
    
    public boolean isInstrucaoTrabalhoIdModified() {
        return aInstrucaoTrabalhoId.isModified();
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Atributo TIPO_ITEM_INSTRUCAO_ID">
    
    public EntItemInstrucao tipoItemInstrucaoId(Long value) {
        setTipoItemInstrucaoId(value);
        return this;
    }
    
    public void setTipoItemInstrucaoId(DomId value) {
        if (value == null || value.isNull()) {
            nullifyTipoItemInstrucaoId();
        } else {
            aTipoItemInstrucaoId.setValue(value.getValue());
            if (aTipoItemInstrucaoId.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setTipoItemInstrucaoId(String value) {
        if (value == null) {
            nullifyTipoItemInstrucaoId();
        } else {
            aTipoItemInstrucaoId.setValue(value);
            if (aTipoItemInstrucaoId.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setTipoItemInstrucaoId(Long value) {
        aTipoItemInstrucaoId.setValue(value);
        if (aTipoItemInstrucaoId.isModified()) {
            setModified(true);
        }
    }
    
    public void setTipoItemInstrucaoId(Object value) {
        aTipoItemInstrucaoId.setValue(value);
        if (aTipoItemInstrucaoId.isModified()) {
            setModified(true);
        }
    }
    
    public void nullifyTipoItemInstrucaoId() {
        if (!aTipoItemInstrucaoId.isNull()) {
            aTipoItemInstrucaoId.setNull(true);
            setModified(true);
        }
    }
    
    public DomId getTipoItemInstrucaoId() {
        return aTipoItemInstrucaoId;
    }
    
    public DomId oldTipoItemInstrucaoId() {
        return oTipoItemInstrucaoId;
    }
    
    public Long valueOfTipoItemInstrucaoId() {
        return aTipoItemInstrucaoId.getValue();
    }
    
    public boolean isTipoItemInstrucaoIdModified() {
        return aTipoItemInstrucaoId.isModified();
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Atributo EXIGE_CONFIRMACAO_EXECUCAO">
    
    public EntItemInstrucao exigeConfirmacaoExecucao(String value) {
        setExigeConfirmacaoExecucao(value);
        return this;
    }
    
    public void setExigeConfirmacaoExecucao(DomFlag value) {
        if (value == null || value.isNull()) {
            nullifyExigeConfirmacaoExecucao();
        } else {
            aExigeConfirmacaoExecucao.setValue(value.getValue());
            if (aExigeConfirmacaoExecucao.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setExigeConfirmacaoExecucao(String value) {
        if (value == null) {
            nullifyExigeConfirmacaoExecucao();
        } else {
            aExigeConfirmacaoExecucao.setValue(value);
            if (aExigeConfirmacaoExecucao.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setExigeConfirmacaoExecucao(Object value) {
        aExigeConfirmacaoExecucao.setValue(value);
        if (aExigeConfirmacaoExecucao.isModified()) {
            setModified(true);
        }
    }
    
    public void nullifyExigeConfirmacaoExecucao() {
        if (!aExigeConfirmacaoExecucao.isNull()) {
            aExigeConfirmacaoExecucao.setNull(true);
            setModified(true);
        }
    }
    
    public DomFlag getExigeConfirmacaoExecucao() {
        return aExigeConfirmacaoExecucao;
    }
    
    public DomFlag oldExigeConfirmacaoExecucao() {
        return oExigeConfirmacaoExecucao;
    }
    
    public String valueOfExigeConfirmacaoExecucao() {
        return aExigeConfirmacaoExecucao.getValue();
    }
    
    public boolean isExigeConfirmacaoExecucaoModified() {
        return aExigeConfirmacaoExecucao.isModified();
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Atributo ACAO_APOS_RESPOSTA">
    
    public EntItemInstrucao acaoAposResposta(String value) {
        setAcaoAposResposta(value);
        return this;
    }
    
    public void setAcaoAposResposta(DomOption value) {
        if (value == null || value.isNull()) {
            nullifyAcaoAposResposta();
        } else {
            aAcaoAposResposta.setValue(value.getValue());
            if (aAcaoAposResposta.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setAcaoAposResposta(String value) {
        if (value == null) {
            nullifyAcaoAposResposta();
        } else {
            aAcaoAposResposta.setValue(value);
            if (aAcaoAposResposta.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setAcaoAposResposta(Object value) {
        aAcaoAposResposta.setValue(value);
        if (aAcaoAposResposta.isModified()) {
            setModified(true);
        }
    }
    
    public void nullifyAcaoAposResposta() {
        if (!aAcaoAposResposta.isNull()) {
            aAcaoAposResposta.setNull(true);
            setModified(true);
        }
    }
    
    public DomOption getAcaoAposResposta() {
        return aAcaoAposResposta;
    }
    
    public DomOption oldAcaoAposResposta() {
        return oAcaoAposResposta;
    }
    
    public String valueOfAcaoAposResposta() {
        return aAcaoAposResposta.getValue();
    }
    
    public boolean isAcaoAposRespostaModified() {
        return aAcaoAposResposta.isModified();
    }
    // </editor-fold>
    // </editor-fold>
    
    @Override
    protected void processDeleteRestrict() throws AdsException {
        // Nullify cascade ZTEST.ITEM_INSTRUCAO.FK_ITMINS_ITEM_INSTR_REFER
        {
            EntItemInstrucao external = new EntItemInstrucao(ctx);
            external.findByItemInstrucaoReferencia(valueOfId());
            if (external.next()) {
                throw new AdsException("ZTEST.ITEM_INSTRUCAO.FK_ITMINS_ITEM_INSTR_REFER.RESTRICTED",
                        AdsException.ERROR,
                        "Não pode excluir porque existem Itens da instrução fazendo referencia para este registro");
            }
            external.close();
        }
    }
    
    @Override
    protected void processDeleteCascade() throws AdsException {
        // Delete cascade ZTEST.ITEM_INSTRUCAO.FK_ITMINS_INSTRUCAO_PAI
        {
            EntItemInstrucao itemInstrucao = new EntItemInstrucao(ctx);
            itemInstrucao.del("select id from ITEM_INSTRUCAO where ITEM_INSTRUCAO_PAI_ID = " + valueOfId());
        }
    }
    
    // <editor-fold defaultstate="collapsed" desc="getErrors">
    /**
     * Traduz um erro recebido do banco de dados para um AdsException
     */
    @Override
    public AdsException getErrors(String errorMsg, int transaction) {
        AdsException e;
        String msg = errorMsg.toUpperCase();
        
        if (transaction == DELETE_TRANSACTION) {
            if (msg.indexOf("FK_ITMINS_ITEM_INSTR_REFER") >= 0) {
                e = new AdsException("ZTEST.ITEM_INSTRUCAO.FK_ITMINS_ITEM_INSTR_REFER.RESTRICTED", 
                        Severity.ERROR,
                        "Não pode excluir porque existem Itens da instrução fazendo referencia para este registro! (FK_ITMINS_ITEM_INSTR_REFER)");
                return e;
            } else {
                e = new AdsException("ZTEST.ITEM_INSTRUCAO.GET_ERRORS_UNKNOWN",
                        AdsException.UNKNOWN,
                        "Erro não esperado: " + errorMsg);
            }
        } else {
            if (msg.indexOf("FK_ITMINS_TIPO_ITEM_INSTRUCAO") >= 0) {
                e = new AdsException("ZTEST.ITEM_INSTRUCAO.FK_ITMINS_TIPO_ITEM_INSTRUCAO", 
                        Severity.ERROR,
                        "Registro não cadastrado para TIPO_ITEM_INSTRUCAO! (FK_ITMINS_TIPO_ITEM_INSTRUCAO)");
                return e;
            } else if (msg.indexOf("FK_ITMINS_ITEM_INSTR_REFER") >= 0) {
                e = new AdsException("ZTEST.ITEM_INSTRUCAO.FK_ITMINS_ITEM_INSTR_REFER", 
                        Severity.ERROR,
                        "Registro não cadastrado para ITEM_INSTRUCAO_REFERENCIA! (FK_ITMINS_ITEM_INSTR_REFER)");
                return e;
            } else if (msg.indexOf("FK_ITMINS_INSTRUCAO_PAI") >= 0) {
                e = new AdsException("ZTEST.ITEM_INSTRUCAO.FK_ITMINS_INSTRUCAO_PAI", 
                        Severity.ERROR,
                        "Registro não cadastrado para ITEM_INSTRUCAO_PAI! (FK_ITMINS_INSTRUCAO_PAI)");
                return e;
            } else if (msg.indexOf("FK_ITMINS_INSTRUCAO_TRABALHO") >= 0) {
                e = new AdsException("ZTEST.ITEM_INSTRUCAO.FK_ITMINS_INSTRUCAO_TRABALHO", 
                        Severity.ERROR,
                        "Registro não cadastrado para INSTRUCAO_TRABALHO! (FK_ITMINS_INSTRUCAO_TRABALHO)");
                return e;
            } else if (msg.indexOf("UK_ITMINS_SIGLA_ITEM") >= 0) {
                e = new AdsException("ZTEST.ITEM_INSTRUCAO.UK_ITMINS_SIGLA_ITEM", 
                        Severity.ERROR,
                        "Registro duplicado! Nome do item da instrução deve ser único. Sigla de identificação do item ${SIGLA} (UK_ITMINS_SIGLA_ITEM)");
                return e;
            } else if (msg.indexOf("PK_ITMINS") >= 0) {
                e = new AdsException("ZTEST.ITEM_INSTRUCAO.PK_ITMINS", 
                        Severity.ERROR,
                        "ID duplicado! (PK_ITMINS)");
                return e;
            } else {
                e = new AdsException("ZTEST.ITEM_INSTRUCAO.GET_ERRORS_UNKNOWN",
                        AdsException.UNKNOWN,
                        "Erro não esperado: " + errorMsg);
            }
        }
        return e;
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Entity Information">
    
    public String getEntityName() {
        return ENTITY_NAME;
    }
    
    public String getTableName() {
        return TABLE_NAME;
    }
    
    public String idSequenceName() {
        return "PK_SEQUENCE";
    }
    
    private ArrayList<Field> allAttributes;
    public ArrayList<Field> getAllAttributes() {
        if (allAttributes == null) {
            allAttributes = new ArrayList<Field>();
            allAttributes.add(aId);
            allAttributes.add(aSigla);
            allAttributes.add(aItemInstrucaoPaiId);
            allAttributes.add(aItemInstrucaoReferenciaId);
            allAttributes.add(aDescricao);
            allAttributes.add(aSequencia);
            allAttributes.add(aInstrucaoTrabalhoId);
            allAttributes.add(aTipoItemInstrucaoId);
            allAttributes.add(aExigeConfirmacaoExecucao);
            allAttributes.add(aAcaoAposResposta);
        }
        return allAttributes;
    }
    
    /**
     * Retorna o valor da primeira UK da entidade
     * Se ela for composta, retorna a concatenação de toda a combinação
     * de atributos separados por um espaço.
     */
    public String valueOfUk() {
        return getSigla().toString();
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Relationships">
    
    
    public void findBySigla(String sigla) throws AdsException {
        findBy(new String[] {"SIGLA"},
                new Object[] {sigla});
    }
    
    private EntTipoItemInstrucao eTipoItemInstrucao;
    
    public EntTipoItemInstrucao findTipoItemInstrucao() throws AdsException {
        if (getTipoItemInstrucaoId().isNull()) {
            return null;
        }
        if (eTipoItemInstrucao == null || !valueOfTipoItemInstrucaoId().equals(eTipoItemInstrucao.valueOfId())) {
            eTipoItemInstrucao = new EntTipoItemInstrucao(ctx);
            eTipoItemInstrucao.find(valueOfTipoItemInstrucaoId());
        }
        return eTipoItemInstrucao;
    }
    
    /**
     * Ativa o join desta entidade com TIPO_ITEM_INSTRUCAO
     * através do atributo TIPO_ITEM_INSTRUCAO_ID
     */
    public EntTipoItemInstrucao joinTipoItemInstrucao() {
        return joinTipoItemInstrucao(null);
    }
    public EntTipoItemInstrucao joinTipoItemInstrucao(String alias) {
        EntTipoItemInstrucao entity = new EntTipoItemInstrucao(ctx);
        if (alias != null) {
            entity.setAlias(alias);
        }
        Join newJoin = new Join(getTipoItemInstrucaoId(), entity);
        entity.setJoinedBy(newJoin);
        this.join(newJoin);
        return entity;
    }
    
    public void findByTipoItemInstrucao(long id, String sqlAppend) throws AdsException {
        find("select ID from ITEM_INSTRUCAO where TIPO_ITEM_INSTRUCAO_ID = ? " + sqlAppend);
        sqlSetLong(1,id);
    }
    
    public void findByTipoItemInstrucao(long id) throws AdsException {
        findByTipoItemInstrucao(id,"");
    }
    
    public void findByTipoItemInstrucao(Entity entidade) throws AdsException {
        findByTipoItemInstrucao(entidade.valueOfId(),"");
    }
    
    public void findByTipoItemInstrucao(Entity entidade, String sqlAppend) throws AdsException {
        findByTipoItemInstrucao(entidade.valueOfId(),sqlAppend);
    }
    
    private EntItemInstrucao eItemInstrucaoReferencia;
    
    public EntItemInstrucao findItemInstrucaoReferencia() throws AdsException {
        if (getItemInstrucaoReferenciaId().isNull()) {
            return null;
        }
        if (eItemInstrucaoReferencia == null || !valueOfItemInstrucaoReferenciaId().equals(eItemInstrucaoReferencia.valueOfId())) {
            eItemInstrucaoReferencia = new EntItemInstrucao(ctx);
            eItemInstrucaoReferencia.find(valueOfItemInstrucaoReferenciaId());
        }
        return eItemInstrucaoReferencia;
    }
    
    /**
     * Ativa o join desta entidade com ITEM_INSTRUCAO
     * através do atributo ITEM_INSTRUCAO_REFERENCIA_ID
     */
    public EntItemInstrucao joinItemInstrucaoReferencia() {
        return joinItemInstrucaoReferencia(null);
    }
    public EntItemInstrucao joinItemInstrucaoReferencia(String alias) {
        EntItemInstrucao entity = new EntItemInstrucao(ctx);
        if (alias != null) {
            entity.setAlias(alias);
        }
        Join newJoin = new Join(getItemInstrucaoReferenciaId(), entity);
        entity.setJoinedBy(newJoin);
        this.join(newJoin);
        return entity;
    }
    
    public void findByItemInstrucaoReferencia(long id, String sqlAppend) throws AdsException {
        find("select ID from ITEM_INSTRUCAO where ITEM_INSTRUCAO_REFERENCIA_ID = ? " + sqlAppend);
        sqlSetLong(1,id);
    }
    
    public void findByItemInstrucaoReferencia(long id) throws AdsException {
        findByItemInstrucaoReferencia(id,"");
    }
    
    public void findByItemInstrucaoReferencia(Entity entidade) throws AdsException {
        findByItemInstrucaoReferencia(entidade.valueOfId(),"");
    }
    
    public void findByItemInstrucaoReferencia(Entity entidade, String sqlAppend) throws AdsException {
        findByItemInstrucaoReferencia(entidade.valueOfId(),sqlAppend);
    }
    
    private EntItemInstrucao eItemInstrucaoPai;
    
    public EntItemInstrucao findItemInstrucaoPai() throws AdsException {
        if (getItemInstrucaoPaiId().isNull()) {
            return null;
        }
        if (eItemInstrucaoPai == null || !valueOfItemInstrucaoPaiId().equals(eItemInstrucaoPai.valueOfId())) {
            eItemInstrucaoPai = new EntItemInstrucao(ctx);
            eItemInstrucaoPai.find(valueOfItemInstrucaoPaiId());
        }
        return eItemInstrucaoPai;
    }
    
    /**
     * Ativa o join desta entidade com ITEM_INSTRUCAO
     * através do atributo ITEM_INSTRUCAO_PAI_ID
     */
    public EntItemInstrucao joinItemInstrucaoPai() {
        return joinItemInstrucaoPai(null);
    }
    public EntItemInstrucao joinItemInstrucaoPai(String alias) {
        EntItemInstrucao entity = new EntItemInstrucao(ctx);
        if (alias != null) {
            entity.setAlias(alias);
        }
        Join newJoin = new Join(getItemInstrucaoPaiId(), entity);
        entity.setJoinedBy(newJoin);
        this.join(newJoin);
        return entity;
    }
    
    public void findByItemInstrucaoPai(long id, String sqlAppend) throws AdsException {
        find("select ID from ITEM_INSTRUCAO where ITEM_INSTRUCAO_PAI_ID = ? " + sqlAppend);
        sqlSetLong(1,id);
    }
    
    public void findByItemInstrucaoPai(long id) throws AdsException {
        findByItemInstrucaoPai(id,"");
    }
    
    public void findByItemInstrucaoPai(Entity entidade) throws AdsException {
        findByItemInstrucaoPai(entidade.valueOfId(),"");
    }
    
    public void findByItemInstrucaoPai(Entity entidade, String sqlAppend) throws AdsException {
        findByItemInstrucaoPai(entidade.valueOfId(),sqlAppend);
    }
    
    private EntInstrucaoTrabalho eInstrucaoTrabalho;
    
    public EntInstrucaoTrabalho findInstrucaoTrabalho() throws AdsException {
        if (getInstrucaoTrabalhoId().isNull()) {
            return null;
        }
        if (eInstrucaoTrabalho == null || !valueOfInstrucaoTrabalhoId().equals(eInstrucaoTrabalho.valueOfId())) {
            eInstrucaoTrabalho = new EntInstrucaoTrabalho(ctx);
            eInstrucaoTrabalho.find(valueOfInstrucaoTrabalhoId());
        }
        return eInstrucaoTrabalho;
    }
    
    /**
     * Ativa o join desta entidade com INSTRUCAO_TRABALHO
     * através do atributo INSTRUCAO_TRABALHO_ID
     */
    public EntInstrucaoTrabalho joinInstrucaoTrabalho() {
        return joinInstrucaoTrabalho(null);
    }
    public EntInstrucaoTrabalho joinInstrucaoTrabalho(String alias) {
        EntInstrucaoTrabalho entity = new EntInstrucaoTrabalho(ctx);
        if (alias != null) {
            entity.setAlias(alias);
        }
        Join newJoin = new Join(getInstrucaoTrabalhoId(), entity);
        entity.setJoinedBy(newJoin);
        this.join(newJoin);
        return entity;
    }
    
    public void findByInstrucaoTrabalho(long id, String sqlAppend) throws AdsException {
        find("select ID from ITEM_INSTRUCAO where INSTRUCAO_TRABALHO_ID = ? " + sqlAppend);
        sqlSetLong(1,id);
    }
    
    public void findByInstrucaoTrabalho(long id) throws AdsException {
        findByInstrucaoTrabalho(id,"");
    }
    
    public void findByInstrucaoTrabalho(Entity entidade) throws AdsException {
        findByInstrucaoTrabalho(entidade.valueOfId(),"");
    }
    
    public void findByInstrucaoTrabalho(Entity entidade, String sqlAppend) throws AdsException {
        findByInstrucaoTrabalho(entidade.valueOfId(),sqlAppend);
    }
    
    /**
     * Limpa os objetos normalizados da entidade
     */
    public void clearRelatedObjects() {
        eTipoItemInstrucao = null;
        eItemInstrucaoReferencia = null;
        eItemInstrucaoPai = null;
        eInstrucaoTrabalho = null;
    }
    /**
     * Retorna os registros de ITEM_INSTRUCAO que referenciam este registro através do atributo ITEM_INSTRUCAO_REFERENCIA_ID
     */
    public EntItemInstrucao findAllItemInstrucaoItemInstrucaoReferencia() throws AdsException {
        return findAllItemInstrucaoItemInstrucaoReferencia("order by ID");
    }
    
    /**
     * Retorna os registros de ITEM_INSTRUCAO que referenciam este registro através do atributo ITEM_INSTRUCAO_REFERENCIA_ID
     */
    public EntItemInstrucao findAllItemInstrucaoItemInstrucaoReferencia(String sqlAppend) throws AdsException {
        EntItemInstrucao out = new EntItemInstrucao(ctx);
        out.find("select ID from ITEM_INSTRUCAO where ITEM_INSTRUCAO_REFERENCIA_ID = " + valueOfId() + " " + sqlAppend);
        return out;
    }
    
    /**
     * Retorna os registros de ITEM_INSTRUCAO que referenciam este registro através do atributo ITEM_INSTRUCAO_PAI_ID
     */
    public EntItemInstrucao findAllItemInstrucaoItemInstrucaoPai() throws AdsException {
        return findAllItemInstrucaoItemInstrucaoPai("order by ID");
    }
    
    /**
     * Retorna os registros de ITEM_INSTRUCAO que referenciam este registro através do atributo ITEM_INSTRUCAO_PAI_ID
     */
    public EntItemInstrucao findAllItemInstrucaoItemInstrucaoPai(String sqlAppend) throws AdsException {
        EntItemInstrucao out = new EntItemInstrucao(ctx);
        out.find("select ID from ITEM_INSTRUCAO where ITEM_INSTRUCAO_PAI_ID = " + valueOfId() + " " + sqlAppend);
        return out;
    }
    
    
    /**
     * Método que copia os valores dos atributos
     * para os valores respectivos old 
     */
    public void saveOldAtributes() {
        oSigla.setValue(aSigla);
        oAcaoAposResposta.setValue(aAcaoAposResposta);
        oExigeConfirmacaoExecucao.setValue(aExigeConfirmacaoExecucao);
        oTipoItemInstrucaoId.setValue(aTipoItemInstrucaoId);
        oSequencia.setValue(aSequencia);
        oInstrucaoTrabalhoId.setValue(aInstrucaoTrabalhoId);
        oDescricao.setValue(aDescricao);
        oItemInstrucaoReferenciaId.setValue(aItemInstrucaoReferenciaId);
        oItemInstrucaoPaiId.setValue(aItemInstrucaoPaiId);
        oId.setValue(aId);
    }
    
    /**
     * Método que retorna as regras da entidade
     * @return ArrayList com as regras ou null caso não existir nenhuma regra
     */
    public ArrayList getAllRules() {
        ArrayList<EntityRule> out = new ArrayList<EntityRule>();
        {
            PrimaryKeyRule rule = new PrimaryKeyRule();
            rule.setEntity(EntItemInstrucao.class);
            rule.setName("PK_ITMINS");
            rule.setPkAttribute(new DomId("ID",""));
            out.add(rule);
        }
        {
            ForeignKeyRule rule = new ForeignKeyRule();
            rule.setEntity(EntItemInstrucao.class);
            rule.setAssociatedEntity(EntItemInstrucao.class);
            rule.setName("FK_ITMINS_INSTRUCAO_PAI");
            rule.addAttribute(new DomId("ITEM_INSTRUCAO_PAI_ID",""));
            out.add(rule);
        }
        {
            ForeignKeyRule rule = new ForeignKeyRule();
            rule.setEntity(EntItemInstrucao.class);
            rule.setAssociatedEntity(EntInstrucaoTrabalho.class);
            rule.setName("FK_ITMINS_INSTRUCAO_TRABALHO");
            rule.addAttribute(new DomId("INSTRUCAO_TRABALHO_ID",""));
            out.add(rule);
        }
        {
            ForeignKeyRule rule = new ForeignKeyRule();
            rule.setEntity(EntItemInstrucao.class);
            rule.setAssociatedEntity(EntItemInstrucao.class);
            rule.setName("FK_ITMINS_ITEM_INSTR_REFER");
            rule.addAttribute(new DomId("ITEM_INSTRUCAO_REFERENCIA_ID",""));
            out.add(rule);
        }
        {
            ForeignKeyRule rule = new ForeignKeyRule();
            rule.setEntity(EntItemInstrucao.class);
            rule.setAssociatedEntity(EntTipoItemInstrucao.class);
            rule.setName("FK_ITMINS_TIPO_ITEM_INSTRUCAO");
            rule.addAttribute(new DomId("TIPO_ITEM_INSTRUCAO_ID",""));
            out.add(rule);
        }
        {
            UniqueKeyRule rule = new UniqueKeyRule();
            rule.setEntity(EntItemInstrucao.class);
            rule.setName("UK_ITMINS_SIGLA_ITEM");
            rule.addAttribute(new DomUpper("SIGLA",""));
            out.add(rule);
        }
        {
            AllowableValuesRule rule = new AllowableValuesRule();
            rule.setEntity(EntItemInstrucao.class);
            rule.setCheckAttribute(new DomOption("ACAO_APOS_RESPOSTA",""));
            rule.setName("CKAV_20654455");
            rule.addAllowableValues(new String[] {"A", "R", "P", "I", "T", "V"});
            out.add(rule);
        }
        return out;
    }
    // </editor-fold>
    
    @Override
    protected void preInsert() throws AdsException {
        calcularSiglaItem(); //Calcular a sigla de identificação do item da instrução
        ajustarAtributosFks(); //Ajustar atributos das fks
    }
    
    @Override
    protected void preUpdate() throws AdsException {
        calcularSiglaItem(); //Calcular a sigla de identificação do item da instrução
        ajustarAtributosFks(); //Ajustar atributos das fks
    }
    
    @Override
    public void fillDefaultValues() throws AdsException {
        if (aId.isNull()) {
            aId.setValue("" + ctx.getNextVal("pk_sequence"));
        }
        if (getAcaoAposResposta().isNull()) {
            setAcaoAposResposta(getAcaoAposResposta().getDefaultValue());
        }
        if (getExigeConfirmacaoExecucao().isNull()) {
            setExigeConfirmacaoExecucao(getExigeConfirmacaoExecucao().getDefaultValue());
        }
    }
    
    // <editor-fold defaultstate="collapsed" desc="Métodos customizados">
    
    /**
     * Calcular a sigla de identificação do item da instrução.
     */
    public void calcularSiglaIdentificacaoItem() throws AdsException {
        // <user-code id="20813074" parentId="20738976" hashcode="14bad940" length="447">
        if (getItemInstrucaoPaiId().isNull()) {
            setSigla(findInstrucaoTrabalho().valueOfNome() + "." + getSequencia().toText()); 
        } else if (getItemInstrucaoPaiId().isNotNull()) {
            setSigla(findItemInstrucaoPai().valueOfSigla() + "." + getSequencia().toText()); 
        }
        upd();
        
        EntItemInstrucao itemFilho = findAllItemInstrucaoItemInstrucaoPai();
        while (itemFilho.next()) {
            itemFilho.calcularSiglaIdentificacaoItem();
        }
        itemFilho.close();
        // </user-code>
    }
    
    /**
     * Regra de ação: Calcular a sigla de identificação do item da instrução
     */
    private void calcularSiglaItem() throws AdsException {
        // <user-code id="20321190" parentId="20320951" hashcode="-451c0225" length="320">
        if (isSequenciaModified()) {
            if (getItemInstrucaoPaiId().isNull()) {
                setSigla(findInstrucaoTrabalho().valueOfNome() + "." + getSequencia().toText()); 
            } else if (getItemInstrucaoPaiId().isNotNull()) {
                setSigla(findItemInstrucaoPai().valueOfSigla() + "." + getSequencia().toText()); 
            }
        }
        // </user-code>
    }
    
    /**
     * Regra de ação: Ajustar atributos das fks
     */
    private void ajustarAtributosFks() throws AdsException {
        // <user-code id="20738476" parentId="20738312" hashcode="-2f7a8d5a" length="284">
        String caracteristica = findTipoItemInstrucao().valueOfCaracteristicaItemInstrucao();
        if (caracteristica.equals("E")) {
            nullifyItemInstrucaoPaiId();
            nullifyItemInstrucaoReferenciaId();
        } else if (!caracteristica.equals("R")) {
            nullifyItemInstrucaoReferenciaId();
        }
        
        // </user-code>
    }
}
